/*Copyright (C) 2009 - 2011 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
#include "piles.h"
/*p
** Permet de remplir la pile.
**
** \parm pile La pile où ajouter les données.
** \parm data La données à insérer dans la pile.
** \return 0 en cas de succès, une autre valeur en cas d'échec
*/
int Pile_Push(Pile *pile, int data) {
	int retVal;

	struct Pile *newData = malloc(sizeof(struct Pile));

	if(newData == EMPTY_STACK) {
		retVal = 1;
	}
	else {
		newData->data = data;
		newData->previous = *pile;
		*pile = newData;
		retVal = 0;
	}

	return retVal;
}

/*
** Permet de retirer un élément de la pile.
**
** \parm pile La pile où enlever l'élément.
** \return 0 en cas de succès, une autre valeur en cas d'échec
*/
int Pile_Pop(Pile *pile) {
	int retVal;

	if(*pile == EMPTY_STACK) {
		retVal = 1;
	}
	else {
		Pile tmp = *pile;
		*pile = tmp->previous;
		free(tmp);
		retVal = 0;
	}

	return retVal;
}

/*
** Permet de savoir si la pile est vide.
**
** \parm pile La pile à vérifier.
** \return 0 si la pile contient des élément, une autre valeur si elle
** n'en contient pas.
*/
int Pile_Empty(Pile pile) {
	if(pile == EMPTY_STACK)
		return 1;
	else
		return 0;
}

/*
** Permet de connaitre la valeur de l'élément en tête de pile.
**
** \parm pile La pile à lire.
** \parm read Sera initialisé à la valeur stockée en tête de pile
** \return 0 en cas de succès, une autre valeur en cas d'échec.
*/
int Pile_Front(Pile pile, int *read) {
	int retVal = 0;

	if(pile) {
		*read = pile->data;
	}
	else {
		retVal = 1;
	}

	return retVal;
}

/*
** Permet de vider la pile. Il est nécessaire d'appeler cette
** fonction à la fin du bloc d'instruction.
**
** \parm La pile à vider.
*/
void Pile_Clear(Pile *pile) {
	while(*pile != EMPTY_STACK && !Pile_Pop(pile))
		;

	*pile = EMPTY_STACK;
}

